navitel: Add write support.
authoroliskoli <oliskoli>
Sun, 21 Sep 2008 17:14:06 +0000 (17:14 +0000)
committeroliskoli <oliskoli>
Sun, 21 Sep 2008 17:14:06 +0000 (17:14 +0000)
navitel.c

index 806816c964ff7f26020f32ebfe346cd535a5344c..7b82d5c80f3e940b5b2c5dbcb1531ce5399ace85 100644 (file)
--- a/navitel.c
+++ b/navitel.c
@@ -27,6 +27,8 @@
 #define MYNAME "navitel"
 
 static gbfile *fin, *fout;
+static char new_track;
+static int trkpts;
 
 /*******************************************************************************
 * %%%        global callbacks called by gpsbabel main process              %%% *
@@ -38,7 +40,7 @@ navitel_rd_init(const char *fname)
        fin = gbfopen(fname, "rb", MYNAME);
 }
 
-static void 
+static void
 navitel_rd_deinit(void)
 {
        gbfclose(fin);
@@ -49,21 +51,21 @@ navitel_read_track(void)
 {
        int points, i;
        route_head *trk = NULL;
-       
+
        points = gbfgetint32(fin);
        (void) gbfgetint32(fin); /* unknown */
-       
+
        for (i = 0; i < points; i++) {
                int lat, lon;
                waypoint *wpt;
-               
+
                lon = gbfgetint32(fin);
                lat = gbfgetint32(fin);
-               
+
                wpt = waypt_new();
                wpt->latitude = GPS_Math_Semi_To_Deg(lat & 0x7FFFFFFF);
                wpt->longitude = GPS_Math_Semi_To_Deg(lon);
-               
+
                if ((lat >> 31) || (trk == NULL)) {
                        trk = route_head_alloc();
                        track_add_head(trk);
@@ -84,28 +86,68 @@ navitel_wr_deinit(void)
        gbfclose(fout);
 }
 
+static void
+navitel_enum_trkpts(const waypoint *wpt)
+{
+       trkpts++;
+}
+
+static void
+navitel_disp_trk_head(const route_head *trk)
+{
+       new_track = 1;
+}
+
+static void
+navitel_disp_trkpts(const waypoint *wpt)
+{
+       int lat, lon;
+
+       lat = GPS_Math_Deg_To_Semi(wpt->latitude);
+       lon = GPS_Math_Deg_To_Semi(wpt->longitude);
+
+       if (new_track) {
+               lat |= (1 << 31);
+               new_track = 0;
+       }
+
+       gbfputint32(lon, fout);
+       gbfputint32(lat, fout);
+}
+
 static void
 navitel_write_track(void)
 {
+       trkpts = 0;
+       track_disp_all(NULL, NULL, navitel_enum_trkpts);
+       if (trkpts > 10000) {
+               trkpts = 10000;
+               warning(MYNAME ": Can store only 10000 points per file!\n");
+       }
+
+       gbfputint32(trkpts, fout);
+       gbfputint32(1, fout);           /* ? */
+       track_disp_all(navitel_disp_trk_head, NULL, navitel_disp_trkpts);
 }
 
 /**************************************************************************/
 
 ff_vecs_t navitel_trk_vecs = {
        ff_type_file,
-       { 
-               ff_cap_none     /* waypoints */, 
-               ff_cap_read     /* tracks */, 
-               ff_cap_none     /* routes */
+       {
+               ff_cap_none                     /* waypoints */,
+               ff_cap_read | ff_cap_write      /* tracks */,
+               ff_cap_none                     /* routes */
        },
-       navitel_rd_init,        
-       navitel_wr_init,        
-       navitel_rd_deinit,      
-       navitel_wr_deinit,      
+       navitel_rd_init,
+       navitel_wr_init,
+       navitel_rd_deinit,
+       navitel_wr_deinit,
        navitel_read_track,
        navitel_write_track,
        NULL,
        NULL,
        CET_CHARSET_UTF8, 1                     /* Nothing to convert */
 };
+
 /**************************************************************************/